package ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas;

import org.joda.time.DateTime;
import org.joda.time.Months;
import org.uqbar.commons.model.Entity;

import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.exceptions.FormatoDeFechaIncorrectoException;

@SuppressWarnings("serial")
public class Captura extends Entity{
	/*
	 * Para nosotros una captura es lo que el tp llama una Infracci�n.
	 * La captura tiene la zona, el tipo de infracci�n cometida y
	 * la foto. Cuando a una captura se le reconoce la patente, esta
	 * captura se agrega al veh�culo correspondiente.
	 */
	public static final String NOMBRE = "nombre";
	private Zona zona;
	private TipoInfraccion infraccion;
	private Image imagen = new Image();
	private boolean pagada = false;
	private DateTime fecha;
	private boolean perdonada = false;
	
	public Captura(){
		
	}
	
	public Captura(Zona zona, TipoInfraccion unaInfraccion, Image imagen, DateTime fecha) throws FormatoDeFechaIncorrectoException {
		this.zona = zona;
		this.infraccion = unaInfraccion;
		this.imagen = imagen;
		this.setFecha(fecha);
	}
	
	public boolean estaVencida(){
		//Returns si la multa tiene mas de 4 anios...
		return antiguedadEnMeses() > (4*12);
	}
	
	public Integer antiguedadEnMeses(){
		
		return Months.monthsBetween(this.getFecha(), new DateTime()).getMonths();
	}
	
	public int getPuntosInfraccion(){
		if (estaPerdonada()){
			return 0;
		}
		return infraccion.getPuntos();
	}
	
	public double getMontoInfraccion(){
		if (estaPagada() || estaVencida() || estaPerdonada()){
			return 0;
		}
		return infraccion.getMonto();
	}

	public double getMontoPagado(){
		if(estaPagada()){
			return infraccion.getMonto();
		}
		return 0;
	}	
	
	
	public boolean tieneMasDe6Meses(){
		return antiguedadEnMeses() > 6;
	}

	public TipoInfraccion getInfraccion() {
		return this.infraccion;
	}

	public Zona getZona() {
		return this.zona;
	}
	
	public Image getImagen(){
		return this.imagen;
	}
	
	public void setImage(Image image){
		if(image != null)
			this.imagen = image;
		else 
			throw new NullPointerException("El campo image no puede ser nulo");
	}
	
	public void setZona(Zona zona){
		if(zona != null)
			this.zona = zona;
		else
			throw new NullPointerException("El campo zona no puede ser nulo");
	}
	
	public void setInfraccion(TipoInfraccion infraccion){
		if(infraccion != null)
			this.infraccion = infraccion;
		else
			throw new NullPointerException("El campo infraccion no puede ser nulo");
	}
	
	public String getDireccionNotificacion(){
		return zona.getDireccionNotificacion();
	}

	public void setPagada(boolean pagada) {
		this.pagada = pagada;
	}

	public boolean estaPagada() {
		return pagada;
	}

	public void setPerdonada(boolean perdonada) {
		this.perdonada = perdonada;
	}

	public boolean estaPerdonada() {
		return perdonada;
	}

	public boolean tieneMasDe1Anio() {
		return antiguedadEnMeses() > 12;
	}

	public void setFecha(DateTime fecha) {
		this.fecha = fecha;
	}

	public DateTime getFecha() {
		return fecha;
	}

	// ********************************************************
	// ** Calculated accesors
	// ********************************************************

	public String getNombreZona() {
		return getZona().getNombre();
	}

	public String getNombreTipoInfraccion() {
		return getInfraccion().getNombre();
	}
	
	public String getNombreImage(){
		return getImagen().getNombre();
	}
	
	public DateTime getFechaCaptura(){
		return getFecha();
	}
	
	public String getNombre(){
		return this.getInfraccion().getNombre();
	}
}